package service

import (
	"fmt"
	"strings"
	
	"git-todo/model"
)

// TodoService 待办事项业务服务
type TodoService struct {
	todoRepo model.TodoRepository
	gitRepo  model.GitRepository
}

// NewTodoService 创建新的Todo服务
func NewTodoService(todoRepo model.TodoRepository, gitRepo model.GitRepository) *TodoService {
	return &TodoService{
		todoRepo: todoRepo,
		gitRepo:  gitRepo,
	}
}

// AddTodo 添加新的待办事项
func (s *TodoService) AddTodo(description string) error {
	// 检查是否为Git仓库
	if !s.gitRepo.IsGitRepository() {
		return fmt.Errorf("当前目录不是Git仓库，请在Git仓库中使用此命令")
	}
	
	// 获取当前分支
	branch, err := s.gitRepo.GetCurrentBranch()
	if err != nil {
		return fmt.Errorf("获取当前分支失败: %v", err)
	}
	
	// 验证描述不为空
	description = strings.TrimSpace(description)
	if description == "" {
		return fmt.Errorf("待办事项描述不能为空")
	}
	
	// 创建新的待办事项
	todo := model.TodoItem{
		Description: description,
		Branch:      branch,
	}
	
	// 添加到仓库
	if err := s.todoRepo.AddTodo(todo); err != nil {
		return fmt.Errorf("添加待办事项失败: %v", err)
	}
	
	return nil
}

// ListTodos 列出当前分支的所有待办事项
func (s *TodoService) ListTodos() ([]model.TodoItem, error) {
	// 检查是否为Git仓库
	if !s.gitRepo.IsGitRepository() {
		return nil, fmt.Errorf("当前目录不是Git仓库，请在Git仓库中使用此命令")
	}
	
	// 获取当前分支
	branch, err := s.gitRepo.GetCurrentBranch()
	if err != nil {
		return nil, fmt.Errorf("获取当前分支失败: %v", err)
	}
	
	// 获取分支的待办事项
	todos, err := s.todoRepo.GetTodosByBranch(branch)
	if err != nil {
		return nil, fmt.Errorf("获取待办事项失败: %v", err)
	}
	
	return todos, nil
}

// CompleteTodo 标记待办事项为完成
func (s *TodoService) CompleteTodo(identifier string) error {
	// 检查是否为Git仓库
	if !s.gitRepo.IsGitRepository() {
		return fmt.Errorf("当前目录不是Git仓库，请在Git仓库中使用此命令")
	}
	
	// 获取当前分支
	branch, err := s.gitRepo.GetCurrentBranch()
	if err != nil {
		return fmt.Errorf("获取当前分支失败: %v", err)
	}
	
	// 验证标识符不为空
	identifier = strings.TrimSpace(identifier)
	if identifier == "" {
		return fmt.Errorf("请提供待办事项的ID或描述")
	}
	
	// 标记为完成
	if err := s.todoRepo.MarkTodoCompleted(branch, identifier); err != nil {
		return err
	}
	
	return nil
}

// GetCurrentBranch 获取当前分支信息
func (s *TodoService) GetCurrentBranch() (string, error) {
	return s.gitRepo.GetCurrentBranch()
}

// IsGitRepository 检查是否为Git仓库
func (s *TodoService) IsGitRepository() bool {
	return s.gitRepo.IsGitRepository()
}

// GetGitInfo 获取Git仓库信息
func (s *TodoService) GetGitInfo() (*model.GitInfo, error) {
	// 检查GitService是否有GetGitInfo方法
	if gitService, ok := s.gitRepo.(*GitService); ok {
		return gitService.GetGitInfo()
	}
	
	// 如果没有，手动构建
	info := &model.GitInfo{
		IsRepo: s.gitRepo.IsGitRepository(),
	}
	
	if info.IsRepo {
		branch, err := s.gitRepo.GetCurrentBranch()
		if err != nil {
			return info, err
		}
		info.Branch = branch
		
		rootDir, err := s.gitRepo.GetGitRootDir()
		if err != nil {
			return info, err
		}
		info.RootDir = rootDir
	}
	
	return info, nil
}